package 多线程初阶.示例测试;

import java.util.Scanner;

/**
 * 内存可见性问题
 */
public class TestDemo15 {
    static class Counter{
        public int flag=0;
    }
    public static void main(String[] args) {
        Counter counter=new Counter();
        Thread threadA=new Thread(()->{
           while (counter.flag==0){
           }
            System.out.println("threadA will die");
        });
        Thread threadB=new Thread(()->{
            Scanner scanner=new Scanner(System.in);
            System.out.println("请输入一个数=>");
            counter.flag=scanner.nextInt();
            /**
             * 按照预期,输入一个非0的数,循环就会结束,但实际预期却没有结束循环
             * threadB修改了以后,将flag副本刷新到了主内存
             * 但threadA所读的仍然是它自己的工作内存中的flag副本,它没有重新去读取主内存最新的数据
             * 而如果对flag加上volatile关键字,就可以让threadA每次都能保证读到最新的数据了
             */
        });
        threadA.start();
        threadB.start();
    }
}
